﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProcelNasEscolas.Model.Fichas;
using ProcelNasEscolas.Model.Interfaces;
using ProcelNasEscolas.Model.Respostas;
using ProcelNasEscolas.Model;

namespace ProcelNasEscolas.Data
{
    public class FichaReuniaoAcompanhamentoDao : AbstractCrudDao<FichaReuniaoAcompanhamentoData>, IFichaReuniaoAcompanhamentoDao 
    {
        public FichaReuniaoAcompanhamento ToModelObject(FichaReuniaoAcompanhamentoData questionarioData)
        {
            FichaReuniaoAcompanhamento questionarioModel = new FichaReuniaoAcompanhamento();
            questionarioModel.Questoes.Clear();
            questionarioModel.DataDePreenchimento = questionarioData.DataDePreenchimento;
            questionarioModel.DataPrimeiraReunião = questionarioData.DataPrimeiraReunião;
            questionarioModel.DataSegundaReunião = questionarioData.DataSegundaReunião;
            questionarioModel.Id = questionarioData.Id;
            questionarioModel.Concessionaria = new EntidadeDao().ToModelObject(questionarioData.ConcessionariaData);
            questionarioModel.Questionado = new EntidadeDao().ToModelObject(questionarioData.IEntidadeData);

            questionarioData.QuestaoData.Load();


            foreach (QuestaoData dataQuestions in questionarioData.QuestaoData)
            {
                QuestaoData temp = (from c in this.GetObjectContext().QuestaoDataSet.Include("RespostaBase") where c.Id == dataQuestions.Id select c).First();
                questionarioModel.Questoes.Add(new QuestaoDao().ToModelObject(temp));
            }

            return questionarioModel;
        }

        public FichaReuniaoAcompanhamentoData CreateOrUpdate(FichaReuniaoAcompanhamento questionarioModel)
        {
            try
            {
                FichaReuniaoAcompanhamentoData questionarioData = new FichaReuniaoAcompanhamentoData();

                IList<FichaReuniaoAcompanhamentoData> questionarios = this.GetObjectContext().IQuestionarioDataSet.OfType<FichaReuniaoAcompanhamentoData>()
                    .Where(questionarioConsulta => questionarioConsulta.Id == questionarioModel.Id).ToList();

                if (questionarios.Count == 0)
                {
                    this.Add("IQuestionarioDataSet", questionarioData);
                }
                else
                {
                    questionarioData = questionarios.First();
                }

                questionarioData.DataDePreenchimento = questionarioModel.DataDePreenchimento;
                IEntidadeData entidadeTemp = new EntidadeDao().CreateOrUpdate(questionarioModel.Questionado);
                questionarioData.IEntidadeData = this.GetObjectContext().IEntidadeDataSet.OfType<IEntidadeData>()
                    .Where(entidadeConsulta => entidadeConsulta.Id == entidadeTemp.Id).First();
                IEntidadeData entidadeTemp2 = new ConcessionariaDao().CreateOrUpdate((Concessionaria)questionarioModel.Concessionaria);
                questionarioData.ConcessionariaData = this.GetObjectContext().IEntidadeDataSet.OfType<ConcessionariaData>()
                    .Where(entidadeConsulta => entidadeConsulta.Id == entidadeTemp2.Id).First();
                questionarioData.DataPrimeiraReunião = questionarioModel.DataPrimeiraReunião;
                questionarioData.DataSegundaReunião = questionarioModel.DataSegundaReunião;

                questionarioData.QuestaoData.Clear();

                foreach (Questao questao in questionarioModel.Questoes)
                {
                    questionarioData.QuestaoData.Add(new QuestaoDao().CreateDataObject(questao));
                }

                this.SaveChanges();

                return questionarioData;
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public FichaReuniaoAcompanhamento GetQuestionario(int Id)
        {
            try
            {
                FichaReuniaoAcompanhamentoData questionario = (FichaReuniaoAcompanhamentoData)(from c in this.GetObjectContext().IQuestionarioDataSet.Include("IEntidadeData").Include("ConcessionariaData") where c.Id == Id select c).First();
                AlunoData alunoTemp = (AlunoData)questionario.IEntidadeData;
                alunoTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData") where c.Id == questionario.IEntidadeData.Id select c).First();
                questionario.IEntidadeData = alunoTemp;
                ConcessionariaData concessionariaTemp = (ConcessionariaData)questionario.ConcessionariaData;
                concessionariaTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<ConcessionariaData>() where c.Id == questionario.ConcessionariaData.Id select c).First();
                questionario.ConcessionariaData = concessionariaTemp;
                questionario.QuestaoData.Load();

                return this.ToModelObject((FichaReuniaoAcompanhamentoData)questionario);
            }
            catch (Exception e)
            {
                System.Console.Out.WriteLine("" + e);
                return null;
            }
        }

        public IList<FichaReuniaoAcompanhamento> GetAll()
        {
            IList<FichaReuniaoAcompanhamentoData> questionarios = (from c in this.GetObjectContext().IQuestionarioDataSet.Include("IEntidadeData").Include("ConcessionariaData").OfType<FichaReuniaoAcompanhamentoData>() select c).ToList();

            IList<FichaReuniaoAcompanhamento> questionariosModel = new List<FichaReuniaoAcompanhamento>();

            foreach (FichaReuniaoAcompanhamentoData questionario in questionarios)
            {
                AlunoData alunoTemp = (AlunoData)questionario.IEntidadeData;
                alunoTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<AlunoData>().Include("TurmaData").Include("TurmaData.EscolaData") where c.Id == questionario.IEntidadeData.Id select c).First();
                questionario.IEntidadeData = alunoTemp;
                ConcessionariaData concessionariaTemp = (ConcessionariaData)questionario.ConcessionariaData;
                concessionariaTemp = (from c in this.GetObjectContext().IEntidadeDataSet.OfType<ConcessionariaData>() where c.Id == questionario.ConcessionariaData.Id select c).First();
                questionario.ConcessionariaData = concessionariaTemp;
                questionario.QuestaoData.Load();
                questionariosModel.Add(this.ToModelObject(questionario));
            }

            return questionariosModel;
        }
    }
}
